package com.epoch.client.kernel.listener;


import com.epoch.client.kernel.serve.ClientConnService;
import com.epoch.client.kernel.serve.SocketMappingManager;
import com.epoch.client.view.ChooseGroup;
import com.epoch.client.view.ClientLoginJFrame;
import com.epoch.common.Message;
import com.epoch.common.User;
import lombok.extern.slf4j.Slf4j;

import javax.swing.*;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.io.IOException;
import java.io.ObjectOutputStream;
import java.net.Socket;
import java.util.Date;

/**
 * 登录按钮的监听类，当用户点击登录按钮后进入此类。
 * 通过 CilentConnServer()类的CheckUser(User u)方法验证用户是否合法
 */
@Slf4j
public class LoginListener implements ActionListener {
    JTextField jtxtNum;                 //账号输入框对象
    JPasswordField jPasswordField;      //密码框对象
    User user;                          //存储用户名和密码的用户类
    ClientLoginJFrame CLJF;             //传递进来的登陆界面对象

    public LoginListener(JTextField jtxtNum, JPasswordField jPasswordField, ClientLoginJFrame CLJF) {
        this.jtxtNum = jtxtNum;
        this.jPasswordField = jPasswordField;
        this.CLJF = CLJF;
    }

    @Override
    public void actionPerformed(ActionEvent e) {
        //通过输入框获取到用户账号
        String username = jtxtNum.getText();
        //通过输入框获取到用户密码
        String userpass = new String(jPasswordField.getPassword()).trim();
        //将用户信息封装到User类中
        user = new User(username,userpass);
        log.info("用户名：" + username + ",密码：" + userpass + "正在验证...");
        //验证用户信息的合法性
        boolean check = new ClientConnService().userAuthentication(user);
        if (check){   //发送一个在线好友的请求包
            try {
                //通过用户账号获取服务器与客户端通讯的（Socket）套接字
                Socket socket = SocketMappingManager.getSocket(username);
                //实例化一个对象输出流用于发送当前好友的在线信息
                ObjectOutputStream oos = new ObjectOutputStream(socket.getOutputStream());
                //实例化一个信息类用于封装信息
                Message message = new Message();
                //设置发送者
                message.setSender(null);
                //避免NollPointerExcetion，填写一些信息
                message.setMessage("登录请求");
                //获取当前时间
                message.setDate(new Date());
                log.info("对象请求包发送成功");
                //通过对象流将message发送到服务器
                oos.writeObject(message);
                //关闭登陆界面
                CLJF.dispose();
                //返回界面
                new ChooseGroup(username);
            } catch (IOException ex) {
                ex.printStackTrace();
            }
        }else{
            //若返回用户不合法则弹窗提醒
            JOptionPane.showMessageDialog(null,"登录失败！！");
        }
    }
}